package ru.zombator.taskman.server.ui;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;

import ru.zombator.taskman.core.query.IResponderSvc;
import ru.zombator.taskman.core.query.LogHandler;
import ru.zombator.taskman.core.ui.ChooseProtocolDialog;
import ru.zombator.taskman.server.query.ServerFactory;
import ru.zombator.taskman.server.query.ServerInitException;

/**
 * Главное окно серверного приложения
 * 
 * @author nvamelichev
 * 
 */
public class ServerWindow extends ApplicationWindow {
	/**
	 * Экземпляр сервера
	 */
	private IResponderSvc serverInstance;
	
	/**
	 * Список сообщений
	 */
	private List list;

	public ServerWindow(Shell parentShell) {
		super(parentShell);
		addMenuBar();
	}

	@Override
	protected MenuManager createMenuManager() {
		MenuManager mgr = new MenuManager("");
		MenuManager file = new MenuManager("&Файл");
		ActionContributionItem fileExit = new ActionContributionItem(
				new Action("В&ыход") {
					@Override
					public void run() {
						close();
					}
				});
		file.add(fileExit);
		mgr.add(file);

		return mgr;
	}

	@Override
	public void create() {
		super.create();
	}

	@Override
	public int open() {
		// выбор протокола
		ChooseProtocolDialog dlg = new ChooseProtocolDialog(null);
		if (dlg.open() == OK) {
			try {
				super.create();
				serverInstance = ServerFactory.createServer(dlg.getProtocol());
				serverInstance.addLogHandler(new LogHandler() {
					@Override
					public void logString(final String str) {
						getShell().getDisplay().syncExec(new Runnable() {
							@Override
							public void run() {
								list.add(str);
							}
						});
					}
				});
				getShell().setText("Серверное приложение");
				return super.open();
			} catch (ServerInitException e) {
				MessageDialog
						.openError(
								getShell(),
								"Ошибка соединения",
								"Не удалось запустить серверное приложение.\n"
										+ "Проверьте, что открыты порты 1099, 1550, 3333 и 5555.\n"
										+ "Для протоколов RMI и CORBA проверьте, что работает сервис именования.");
				e.printStackTrace();
				close();
				System.exit(-1);
			}
		}
		return CANCEL;
	}

	@Override
	public boolean close() {
		if (serverInstance != null)
			serverInstance.dispose();
		return super.close();
	}

	@Override
	protected Control createContents(Composite parent) {
		Composite inner = new Composite(parent, SWT.NONE);
		inner.setLayout(new FillLayout(SWT.HORIZONTAL));

		list = new List(inner, SWT.BORDER);

		return inner;
	}

	@Override
	protected Point getInitialSize() {
		return new Point(1000, 600);
	}
}
